module.exports = app => {
  const express = require('express')
  const router = express.Router({
    mergeParams: true
    // 合并参数
  })

  const jwt = require('jsonwebtoken') // 加密
  const AdminUser = require('../../models/AdminUser')

  // 添加
  router.post('/', async (req, res) => {
    console.log(req.body)
    var model = await req.Model.create(req.body)
    res.send(model)
  })
  
  // 获取全部
  router.get('/all',async (req, res) => {
    const queryOptions = {}
    if (req.Model.modelName === 'Category') {
      queryOptions.populate = 'parent'
    }
    //.populate 将关联字段的全部信息获取出来 把自己的父类拿出来
    var items = await req.Model.find().setOptions(queryOptions).limit(100)
    // var items = await req.Model.find().setOptions(queryOptions).limit(100)
    // var items = await req.Model.find().populate('parent').limit(10)
    res.send(items)
  })


  /**
   * 查询数据
   * @param {number} page 当前页码
   * @param {number} pageSize 每页数据条数
   * @returns {arr} 数据列表
   */
  router.get('/', async (req, res) => {
    // 总条数 & 总页数 
    let totalCount, pages
    let { page, pageSize } = req.query
    // console.log(req.query);
    
    totalCount = await req.Model.countDocuments()
    pages = Math.ceil(totalCount / pageSize) || 1
    page = parseInt(page) || 1;
    if (pageSize === 'all') {
      pageSize = totalCount
    } else {
      pageSize = parseInt(pageSize) || 10
    }

    await req.Model
      .find()
      .skip((page - 1) * pageSize)
      .limit(pageSize)
      .exec((err, data) => {
        // 出错
        err && res.send({ code: 0, msg: err.errmsg })
        res.send({ code: 1, page, totalCount, pages, pageSize, data })
      })
  })




  // 获取单个
  router.get('/:id', async (req, res) => {
    var model = await req.Model.findById(req.params.id)
    res.send(model)
  })
  // 修改
  router.put('/:id', async (req, res) => {
    var model = await req.Model.findByIdAndUpdate(req.params.id, req.body)
    res.send(model)
  })
  // 删除
  router.delete('/:id', async (req, res) => {
    await req.Model.findByIdAndDelete(req.params.id, req.body)
    res.send({
      success: '成功'
    })
  })
    /**
   * 根据父级分类名查询子分类集合
   * @param {string} parentName 父级分类名
   * @returns {arr} 子分类数组
   */
  router.get('/category/subList', async (req, res) => {
    // 父级分类id & 查询参数
    let parentId, query
    // 父级分类名
    let { parentName } = req.query
    
    // 通过名称查询父级分类 id
    await req.Model.find({ name: parentName }).then(data => {
      if (data.length) {
        parentId = data[0]._id
      }
      
      query = {
        parent: parentId
      }
    })
    await req.Model
      .find(query)
      .exec((err, data) => {
        err && res.send({ code: 0, msg: err.errmsg })
        res.send({ code: 1, data })
      })
  })
   /**
   * 根据父级分类名查询子分类集合
   * @param {string} parentName 父级分类名
   * @returns {arr} 子分类数组
   */
  router.get('/category/subList', async (req, res) => {
    // 父级分类id & 查询参数
    let parentId, query
    // 父级分类名
    let { parentName } = req.query

    // 通过名称查询父级分类 id
    await req.Model.find({ name: parentName }).then(data => {
      if (data.length) {
        parentId = data[0]._id
      }

      query = {
        parent: parentId
      }
    })

    await req.Model
      .find(query)
      .exec((err, data) => {
        err && res.send({ code: 0, msg: err.errmsg })
        res.send({ code: 1, data })
      })
  })



  app.use(require('cors')()) // 跨域
  app.use(express.json()) // 使用json
  // 引入登录校验中间件
  const authMiddleware = require('../../middleware/auth')
  // 引入资源模型
  const resourceMiddleware = require('../../middleware/resource')
  app.use('/admin/api/rest/:resource',authMiddleware(), resourceMiddleware(),router)

  // 通用接口  
  // upload.single('file') 中间件
  const multer = require('multer')
  const upload = multer({ dest: __dirname + '/../../uploads' })
  app.use('/admin/api/upload',authMiddleware() , upload.single('file') ,async (req,res) => {
    const file = req.file
    // file.url = `http://localhost:3000/uploads/${file.filename}`
    // file.url = `http://jirtayo.cool/uploads/${file.filename}`
    file.url = `http://47.107.136.222/uploads/${file.filename}`
    res.send(file)
  })

  // 登录接口
  app.post('/admin/api/login', async (req, res) => {
    const { username, password } = req.body
    // 1.根据用户名找用户    
    // AdminUser 里面password设置为不可见   通过.select('+password')查找出来
    const user = await AdminUser.findOne({ username }).select('+password')
    // assert(user, 422, '用户不存在')
    if (!user) {
      const user = await AdminUser.create(req.body)
      return res.status(422).send({
        message: '用户不存在,已创建成功,请点击重新登录'
      })
    }
    // 2.校验密码
    const isValid = require('bcryptjs').compareSync(password, user.password)
    if (!isValid) {
      return res.status(422).send({
        message: '密码错误'
      })
    }
    // 3.返回token
    // 将id加密
    const token = jwt.sign({ id: user._id }, app.get('secret'))
    res.send({token,username})
  })

  // 错误处理函数
  // app.use(async (err, req, res, next) => {
  //     res.status(err.statusCode || 204).send({
  //       message: err.message
  //     })
  // })
}